package com.sunny.design.facade.registry;

import com.sunny.design.facade.User;
import com.sunny.design.facade.SendMessage;

/**
 * 门面模式（Facade Pattern）
 *  门面模式又叫外观模式，提供了一个统一的接口，用来访问子系统中的一群接口。其主要特征是定义了一个高层接口，让子系统更容易使用
 *  属于结构性模式。
 *
 *  像我们常用的三层模型MVC, controller层就是一个门面模式, 对外提供统一接口, 其他功能都在内部实现, 不需要用户重复调用多次
 *
 * 门面模式主要包含 2 种角色
 * 1、外观角色（Facade）：也称 门面角色，系统对外的统一接口
 * 2、子系统角色（SubSystem）：可以同时有一个或多个 SubSystem。每个 SubSytem 都不是一个单独
 *      的类，而是一个类的集合。SubSystem 并不知道 Facade 的存在，对于 SubSystem 而言，Facade 只
 *      是另一个客户端而已（即 Facade 对 SubSystem 透明）。
 *
 * 优点：
 *  1、简化了调用过程，无需深入了解子系统，以防给子系统带来风险
 *  2、减少系统依赖、松散耦合
 *  3、更好地划分访问层次，提高了安全性
 *  4、遵循迪米特法则，即最少知道原则
 *
 * 缺点：
 *  1、当增加子系统和扩展子系统行为时，可能容易带来未知风险
 *  2、不符合开闭原则
 *  3、某些情况下可能违背单一职责原则
 * @author Sunny
 * @date 2020/3/5
 */
public class RegisterFacade {

    private User user;
    private SendMessage sendMessage = new SendMessage("coupon");

    public RegisterFacade(User user) {
        this.user = user;
    }

    public void register() {
        System.out.println("注册用户名为: " + user.getUserName() + ", 密码为: " + user.getPassword());
        sendMessage.send(user);
    }
}
